﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Collections;
using ControllerLag;
using Model;
using System.ServiceModel.Activation;

namespace Service
{
	[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class KundeService : IKundeService
	{
		Controller controller;
		Kunde nuværendeKunde;

		public KundeService()
		{
			if (controller == null)
			{
				controller = new Controller(false);
			}
		}

		public Ordre[] HentOrdrer()
		{
			IEnumerator iterator = controller.HentOrdreListe();
			List<Ordre> ordrer = new List<Ordre>();
			if (nuværendeKunde != null)
			{
				Kunde kunde = nuværendeKunde;

				iterator.Reset();

				while (iterator.MoveNext())
				{
					Model.Ordre ordre = (Model.Ordre)iterator.Current;
					Ordre ordredto = new Ordre(ordre.Ordrenr, ordre.Dato, null);
					foreach (Delordre delordre in ordre.Delordreliste)
					{
						if (delordre.Kunde.KundeNr == kunde.KundeNr)
						{
							ordredto.Delordreliste.Add(new DelordreDTO(null, delordre.Delordrenr, delordre.Betalt, delordre.Betalingsmetode));
						}
					}
					if (ordre.Delordreliste.Any())
						ordrer.Add(ordredto);
				}

			}

			return ordrer.ToArray();
		}

		public HomepartyDTO[] HentHomeparties()
		{
			//TODO: Lav metode, så den retunerer et homeparty DTO objekt, der kan bruges i webinterface :)
			List<Homeparty> homeparties = controller.HentHomepartyListe();
			List<HomepartyDTO> returliste = new List<HomepartyDTO>();

			foreach (Homeparty homeparty in homeparties)
			{
				if (homeparty.Værtinde.KundeNr == nuværendeKunde.KundeNr)
					returliste.Add(new HomepartyDTO(homeparty.Id, homeparty.Dato, homeparty.Region, homeparty.Sælger.Navn, homeparty.Sælger.Tlf, homeparty.Sælger.Mail, homeparty.Sælger.Adresse, homeparty.Sælger.PostNr, homeparty.Sælger.Bynavn));
			}

			return returliste.ToArray();
		}

		public KundeDTO FindesKunde(int kundenr)
		{
			bool kundeFindes = false;
			if (controller.FindKunde(kundenr) == null)
			{
				if (controller.HentKunde(kundenr))
				{
					kundeFindes = true;
				}
			}

			if (kundeFindes)
			{
				nuværendeKunde = controller.FindKunde(kundenr);
				if (nuværendeKunde != null)
				{
					KundeDTO kunde = new KundeDTO(nuværendeKunde.Navn, nuværendeKunde.Adresse, nuværendeKunde.Mail,
												  nuværendeKunde.PostNr, nuværendeKunde.KundeNr, nuværendeKunde.TlfNr);

					controller.HentKundeDelordre(kundenr);
					controller.HentKundeHomeparties(kundenr);
					return kunde;
				}
			}
			return null;
		}

		public DelordreDTO HentDelordre(int delordrenr)
		{
			Delordre delordre = controller.FindDelordre(delordrenr);

			DelordreDTO delordreDTO = new DelordreDTO(null, delordre.Delordrenr, delordre.Betalt, delordre.Betalingsmetode);

			delordreDTO.Delordrelinieliste = delordre.HentDelordrelinie().Select(x => new DelordrelinieDTO(new VareDTO(x.Vare.VareNr, x.Vare.Navn, x.Vare.Beskrivelse), x.Antal, x.Pris)).ToList();

			return delordreDTO;
		}


		public HomepartyDTO HentHomeparty(int homepartynr)
		{
			Homeparty homeparty = controller.FindHomeparty(homepartynr);
			return new HomepartyDTO(homeparty.Id, homeparty.Dato, homeparty.Region, homeparty.Sælger.Navn, homeparty.Sælger.Tlf, homeparty.Sælger.Mail, homeparty.Sælger.Adresse, homeparty.Sælger.PostNr, homeparty.Sælger.Bynavn);
		}
	}
}
